﻿#pragma once
#include<stdio.h>
#include<locale.h>
#include<windows.h>
#include<stdbool.h>
#include<stdlib.h>
#include<time.h>

#define WALL L'□'
#define FOOD L'★'
#define BODY L'●'
#define POS_X 24
#define POS_Y 5

//类型的声明

//蛇结点的声明
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode, *pSnakeNode;

//贪吃蛇
//蛇的方向
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};
//蛇的状态:正常，撞墙，撞到自己，正常退出
enum GAME_STATUS
{
	OK,//正常状态
	KILL_BY_SELF,//撞到自己
	KILL_BY_WALL,//撞墙
	END_NORMAL//正常退出
};
typedef struct Snake
{
	pSnakeNode _pSnake;//指向蛇头的指针
	pSnakeNode _pFood;//指向食物结点的指针
	enum DIRECTION _dir;//蛇的方向
	enum GAME_STATUS _status;//游戏的状态
	int _food_weight;//每个食物的分值
	int _score;//总成绩
	int _sleep_time;//休息时间，时间越短，速度越快，反之，速度越慢
}Snake, *pSnake;

//函数
void GameStart(pSnake pS);//游戏初始化
void SetPos(int x, int y);//设置光标位置
void WelcomeToGame();//打印欢迎界面与功能介绍
void CreateMap();//创建地图
void InitSnake(pSnake pS);//初始化蛇身
void CreateFood(pSnake pS);//创建食物
void GameRun(pSnake pS);//游戏的运行逻辑
void SnakeMove(pSnake pS);//蛇走一步的过程
int NextIsFood(pSnakeNode pN, pSnake pS);//判断下一个坐标是否是食物
void EatFood(pSnakeNode pN, pSnake pS);//下一个位置是食物，吃食物
void NoFood(pSnakeNode pN, pSnake pS);//下一个位置不是食物
//检测蛇是否撞墙或撞到自己
void KillByWall(pSnake pS);
void KillBySelf(pSnake pS);
void GameEnd(pSnake pS);//结束游戏:游戏的善后工作